//无缓冲的通道是指在接收前没有能力保存任何值的通道
//有缓冲的通道是一种在被接收前能存储一个或者多个值的通道
//无缓冲的通道又称为阻塞的通道。我们来看一下下面的代码：

package main

import "fmt"

func main() {
	ch := make(chan int)
	ch <- 10
	fmt.Println("发送成功")
}

//上面这段代码能够通过编译，但是执行的时候会出现以下错误：
/*fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
E:/GolandProjects/GoProject/fgf.go:7 +0x31
为什么会出现deadlock错误呢？
因为我们使用ch := make(chan int)创建的是无缓冲的通道，无缓冲的通道只有在有人接收值的时候才能发送值。
简单来说就是无缓冲的通道必须有接收才能发送。*/
func recv(c chan int) {
	ret := <-c
	fmt.Println("接收成功", ret)
}
func mainl() {
	ch := make(chan int)
	go recv(ch) // 启用goroutine从通道接收值
	ch <- 10
	fmt.Println("发送成功")
}

/*无缓冲通道上的发送操作会阻塞，直到另一个goroutine在该通道上执行接收操作，这时值才能发送成功，两个goroutine将继续执行。
相反，如果接收操作先执行，接收方的goroutine将阻塞，直到另一个goroutine在该通道上发送一个值。
使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此，无缓冲通道也被称为同步通道。*/
